package ar.uba.fi.algo3.tests;

import junit.framework.TestCase;

import org.junit.Test;

import ar.uba.fi.algo3.auxiliares.DireccionDerecha;
import ar.uba.fi.algo3.auxiliares.DireccionDerechaInferior;
import ar.uba.fi.algo3.auxiliares.DireccionIzquierda;
import ar.uba.fi.algo3.auxiliares.DireccionIzquierdaInferior;
import ar.uba.fi.algo3.auxiliares.DireccionIzquierdaSuperior;
import ar.uba.fi.algo3.auxiliares.DireccionSuperior;
import ar.uba.fi.algo3.auxiliares.Posicion;
import ar.uba.fi.algo3.modelo.BatallaNaval;
import ar.uba.fi.algo3.modelo.CampoBatalla;
import ar.uba.fi.algo3.modelo.Jugador;
import ar.uba.fi.algo3.modelo.astillero.Astillero;
import ar.uba.fi.algo3.modelo.astillero.AstilleroDeBuques;
import ar.uba.fi.algo3.modelo.astillero.AstilleroDeDestructores;
import ar.uba.fi.algo3.modelo.astillero.AstilleroDeLanchas;
import ar.uba.fi.algo3.modelo.astillero.AstilleroDePortaAviones;
import ar.uba.fi.algo3.modelo.astillero.AstilleroDeRompeHielos;
import ar.uba.fi.algo3.modelo.disparo.Disparo;
import ar.uba.fi.algo3.modelo.disparo.DisparoConvencional;
import ar.uba.fi.algo3.modelo.disparo.MinaSubmarinaPorContacto;
import ar.uba.fi.algo3.modelo.disparo.MinaSubmarinaTripleConRetardo;
import ar.uba.fi.algo3.modelo.nave.Nave;


public class BatallaNavalTest extends TestCase {
	
	CampoBatalla campoBatalla;
	Jugador jugador;
	BatallaNaval batallaNaval;
	Astillero fabricaDeLanchas, fabricaDeBuques, fabricaDeDestructores, fabricaDePortaAviones, fabricaDeRompeHielos;
	Disparo unDisparo;
	
	public void setUp (){
		
		batallaNaval = new BatallaNaval();    
		fabricaDeLanchas= new AstilleroDeLanchas();
		fabricaDeBuques= new AstilleroDeBuques();
		fabricaDeDestructores= new AstilleroDeDestructores();
		fabricaDePortaAviones= new AstilleroDePortaAviones();
		fabricaDeRompeHielos= new AstilleroDeRompeHielos();
		campoBatalla= new CampoBatalla();
		jugador= new Jugador();
		batallaNaval.setJuegoEmpezo();
	}
	
	@Test
	public void testUsarDisparoYtocarDosNavesEnLaMismaPosicion(){
		
		fabricaDeLanchas= new AstilleroDeLanchas();
		fabricaDeBuques= new AstilleroDeBuques();
                
		Nave unaLancha= fabricaDeLanchas.crearNaveEn(new Posicion (2,1), campoBatalla, new DireccionDerecha());
		Nave unBuque= fabricaDeBuques.crearNaveEn(new Posicion(2,1), campoBatalla, new DireccionDerecha());
		
		batallaNaval.insertarAlCampo(unaLancha);
		batallaNaval.insertarAlCampo(unBuque);
		
		unDisparo= new DisparoConvencional( new Posicion(3,1),campoBatalla);
		
		assertEquals(unaLancha.obtenerComponentes().get(0).getDureza(),1);
        assertEquals(unaLancha.obtenerComponentes().get(1).getDureza(),1);
        
        assertEquals(unBuque.obtenerComponentes().get(0).getDureza(),1);
        assertEquals(unBuque.obtenerComponentes().get(1).getDureza(),1);
        assertEquals(unBuque.obtenerComponentes().get(2).getDureza(),1);
        assertEquals(unBuque.obtenerComponentes().get(3).getDureza(),1);
        
        unDisparo.crearDisparo(new Posicion(3,1),this.campoBatalla );
        
        batallaNaval.insertarAlCampo(unDisparo);
        
        batallaNaval.avanzarUnTurno();
        
		jugador.descontarPuntajePorDisparo(unDisparo.obtenerCosto());
		
        		
		assertEquals(jugador.obtenerPuntaje(),9800);

		assertEquals(unaLancha.obtenerComponentes().get(0).getDureza(),1);
        assertEquals(unaLancha.obtenerComponentes().get(1).getDureza(),0);
        
        assertEquals(unBuque.obtenerComponentes().get(0).getDureza(),0);
        assertEquals(unBuque.obtenerComponentes().get(1).getDureza(),0);
        assertEquals(unBuque.obtenerComponentes().get(2).getDureza(),0);
        assertEquals(unBuque.obtenerComponentes().get(3).getDureza(),0);
        
	}
	
	@Test
	public void testMovimientoIndependiente(){
		
		Nave unaLancha= fabricaDeLanchas.crearNaveEn(new Posicion(7,1),campoBatalla , new DireccionDerecha());
		
		batallaNaval.insertarAlCampo(unaLancha);
		
		assertEquals(unaLancha.obtenerComponentes().get(0).getPosicion().getX(),7);
		assertEquals(unaLancha.obtenerComponentes().get(0).getPosicion().getY(),1);
		
		assertEquals(unaLancha.obtenerComponentes().get(1).getPosicion().getX(),8);
		assertEquals(unaLancha.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		batallaNaval.avanzarUnTurno();
		
		assertEquals(unaLancha.obtenerComponentes().get(0).getPosicion().getX(),8);
		assertEquals(unaLancha.obtenerComponentes().get(0).getPosicion().getY(),1);
		
		assertEquals(unaLancha.obtenerComponentes().get(1).getPosicion().getX(),9);
		assertEquals(unaLancha.obtenerComponentes().get(1).getPosicion().getY(),1);			
	}
	
	@Test 
	public void testJuego(){
		
		Nave unaLancha= fabricaDeLanchas.crearNaveEn(new Posicion(7,0),campoBatalla , new DireccionDerecha());
		Nave unDestructor= fabricaDeDestructores.crearNaveEn(new Posicion(7,9), campoBatalla, new DireccionDerechaInferior());
		Nave unBuque= fabricaDeBuques.crearNaveEn(new Posicion(6,0), campoBatalla, new DireccionSuperior());
		Nave unPortaAvion= fabricaDePortaAviones.crearNaveEn(new Posicion(0,8), campoBatalla, new DireccionIzquierda());
		Nave unRompeHielos= fabricaDeRompeHielos.crearNaveEn(new Posicion(0,0), campoBatalla,new DireccionIzquierdaSuperior());
		Nave unaLancha2= fabricaDeLanchas.crearNaveEn(new Posicion(7,4), campoBatalla, new DireccionIzquierdaInferior());
		Nave unDestructor2= fabricaDeDestructores.crearNaveEn(new Posicion(7,8), campoBatalla, new DireccionIzquierda());
		
		batallaNaval.insertarAlCampo(unaLancha);
		batallaNaval.insertarAlCampo(unaLancha2);
		batallaNaval.insertarAlCampo(unBuque);
		batallaNaval.insertarAlCampo(unDestructor);
		batallaNaval.insertarAlCampo(unDestructor2);
		batallaNaval.insertarAlCampo(unRompeHielos);
		batallaNaval.insertarAlCampo(unPortaAvion);
				
		unDisparo= new MinaSubmarinaTripleConRetardo( new Posicion(5,7), campoBatalla);
		
		unDisparo.crearDisparo(new Posicion(5,7),this.campoBatalla );
        
        batallaNaval.insertarAlCampo(unDisparo);
        
        batallaNaval.avanzarUnTurno();
        
		jugador.descontarPuntajePorDisparo(unDisparo.obtenerCosto());
		
		assertEquals(jugador.obtenerPuntaje(),9875);
		//batallaNaval.avanzarUnTurno();
		
		unDisparo= new MinaSubmarinaPorContacto( new Posicion(3,2),campoBatalla);	

		unDisparo.crearDisparo(new Posicion(3,2),this.campoBatalla );
        
        batallaNaval.insertarAlCampo(unDisparo);
        
        batallaNaval.avanzarUnTurno();
        
		jugador.descontarPuntajePorDisparo(unDisparo.obtenerCosto());
		
		assertEquals(jugador.obtenerPuntaje(),9725);
		
		unDisparo= new DisparoConvencional( new Posicion(1,1), campoBatalla);

		unDisparo.crearDisparo(new Posicion(1,1),this.campoBatalla );
        
        batallaNaval.insertarAlCampo(unDisparo);
        
        batallaNaval.avanzarUnTurno();
        
		jugador.descontarPuntajePorDisparo(unDisparo.obtenerCosto());		
		assertEquals(jugador.obtenerPuntaje(),9525);
		
		assertEquals(unaLancha.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unaLancha.obtenerComponentes().get(1).getDureza(),1);
		
		assertEquals(unaLancha2.obtenerComponentes().get(0).getDureza(),0);
		assertEquals(unaLancha2.obtenerComponentes().get(1).getDureza(),0);
		
		assertEquals(unDestructor.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unDestructor.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unDestructor.obtenerComponentes().get(2).getDureza(),1);
		
		assertEquals(unDestructor2.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unDestructor2.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unDestructor2.obtenerComponentes().get(2).getDureza(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(2).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(3).getDureza(),1);
		
		assertEquals(unPortaAvion.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(1).getDureza(),0);
		assertEquals(unPortaAvion.obtenerComponentes().get(2).getDureza(),0);
		assertEquals(unPortaAvion.obtenerComponentes().get(3).getDureza(),0);
		assertEquals(unPortaAvion.obtenerComponentes().get(4).getDureza(),0);
		
		assertEquals(unRompeHielos.obtenerComponentes().get(0).getDureza(),2);
		assertEquals(unRompeHielos.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unRompeHielos.obtenerComponentes().get(2).getDureza(),2);		
	}
	
	public void testHundidos(){
		
		Nave unaLancha= fabricaDeLanchas.crearNaveEn(new Posicion(7,0),campoBatalla , new DireccionDerecha());
		batallaNaval.insertarAlCampo(unaLancha);
		unDisparo= new MinaSubmarinaTripleConRetardo( new Posicion(5,7), campoBatalla);
		
		unDisparo.crearDisparo(new Posicion(5,7),this.campoBatalla );
        
        batallaNaval.insertarAlCampo(unDisparo);
        
        batallaNaval.avanzarUnTurno();
        
		jugador.descontarPuntajePorDisparo(unDisparo.obtenerCosto());
		
		assertEquals(batallaNaval.todasLasNavesHundidas(),false);			
	}
/*	
	public void testPuntosAcabados(){
		
		Nave unaLancha= fabricaDeLanchas.crearNaveEn(new Posicion(7,0),campoBatalla , new DireccionDerecha());
		batallaNaval.insertarAlCampo(unaLancha);
		jugador.empezar(batallaNaval);
		unDisparo= new DisparoConvencional( new Posicion(5,7), campoBatalla);
		jugador.disparar(unDisparo);
		
		batallaNaval.avanzarUnTurno();
		assertEquals(batallaNaval.puntosAcabados(),true);		
	}*/
	
}
